package fr.expdev.bndd.data;

import fr.expdev.bndd.data.sqlite.ConfigSQLite;
import fr.expdev.bndd.data.sqlite.BNDDSQLite.ConfigColumn;
import android.content.Context;
import android.database.Cursor;
import android.util.SparseArray;

public class Configuration {

	/**
	 * Instance du singleton
	 */
	private static Configuration instance;
	
	private static ConfigSQLite db;
	
	/**
	 * Map des valeurs
	 */
	private SparseArray<String> values = new SparseArray<String>();
	
	/**
	 * Enum qui représente la clé.
	 */
	public enum Key {
		AUTOREFRESH_ENABLED(0),
		AUTOREFRESH_INTERVAL(1),
		REFRESH_ATSTARTUP(2);
		
		private int value;
		
		private Key(int x) {
			value = x;
		}
		
		public int intValue() {
			return value;
		}
	}
	
	private Configuration() {}
	
	/**
	 * Récupération du singleton
	 * @return Le singleton
	 */
	public static Configuration getInstance(Context context) {
		if (instance == null) {
			instance = new Configuration();
			db = new ConfigSQLite(context);
			
			db.open(false);
			Cursor c = db.getConfigurationCursor();
			
			if (c.moveToFirst() == false) {
				instance.reset();
			} else {
				do {
					instance.values.put(
							c.getInt(ConfigColumn.CONFIG_NAME.getId()), 
							c.getString(ConfigColumn.CONFIG_VALUE.getId()));
				} while(c.moveToNext());
			}
			c.close();
			
			db.close();
		}
		return instance;
	}
	
	/**
	 * Récupération d'une valeur
	 * @param name
	 * @return La valeur
	 */
	protected String getString(Key name) {
		return values.get(name.intValue());
	}
	
	/**
	 * Récupération d'une valeur booléene
	 * @param name
	 * @return La valeur booléene
	 */
	protected boolean getBoolean(Key name) {
		return values.get(name.intValue()).equals("true");
	}
	
	/**
	 * Récupération d'une valeur booléene
	 * @param name
	 * @return La valeur booléene
	 */
	protected int getInt(Key name, int default_integer) {
		try {
			return Integer.parseInt(values.get(name.intValue()));
		} catch (Exception e) {
			return default_integer;
		}
	}
	
	/**
	 * Sauvegarde d'une configuration
	 * @param name Nom de la valeur
	 * @param value Valeur
	 */
	protected void setString(Key key, String value) {
		values.put(key.intValue(), value);
		
		db.open(true);
		db.set(key, value);
		db.close();
	}
	
	/**
	 * Sauvegarde d'une configuration
	 * @param name Nom de la valeur
	 * @param value Valeur
	 */
	protected void setBoolean(Key name, boolean value) {
		setString(name, value ? "true" : "false");
	}
	
	/**
	 * Sauvegarde d'une configuration
	 * @param name Nom de la valeur
	 * @param value Valeur
	 */
	protected void setInt(Key name, int value) {
		setString(name, value + "");
	}
	
	/**
	 * Effectue un reset de la configuration
	 */
	public void reset() {
		db.open(true);
	
		// Initialisation
		values.put(Key.AUTOREFRESH_ENABLED.intValue(), "true");
		values.put(Key.AUTOREFRESH_INTERVAL.intValue(), "30");
		values.put(Key.REFRESH_ATSTARTUP.intValue(), "true");
		
		// Sauvegarde
		db.set(values);
		
		db.close();
	}

	public boolean isAutoRefreshEnabled() {
		return getBoolean(Key.AUTOREFRESH_ENABLED);
	}

	public void setAutoRefreshEnabled(boolean autoRefresh) {
		setBoolean(Key.AUTOREFRESH_ENABLED, autoRefresh);
	}

	public int getAutoRefreshInterval() {
		return getInt(Key.AUTOREFRESH_INTERVAL, 0);
	}

	public boolean isRefreshAtStartupEnabled() {
		return getBoolean(Key.REFRESH_ATSTARTUP);
	}

	public void setRefreshAtStartupEnabled(boolean refreshAtStartup) {
		setBoolean(Key.REFRESH_ATSTARTUP, refreshAtStartup);
	}
}
